#include "CameraTriggerSettings.h"
#include "ui_CameraTriggerSettings.h"
#include <QDebug>
#include <QMouseEvent>

/**
 * @brief CameraTriggerSettings构造函数
 * 
 * @param cameraManager 相机管理器指针，用于与相机设备通信
 * @param deviceId 设备ID，指定要设置的相机设备
 * @param parent 父窗口指针
 */
CameraTriggerSettings::CameraTriggerSettings(VisiyunDevice *pCameraDevice, const QString &deviceId, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::CameraTriggerSettings),
    m_deviceId(deviceId),
    m_pCameraDevcice(pCameraDevice),
    m_isDragging(false),
    m_tempTriggerEdge(0),  // 默认值为上升沿
    m_tempTriggerChannel(0)  // 默认值为通道0
{
    ui->setupUi(this);
    
    // 移除默认标题栏，使用自定义标题栏
    setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
    
    // 初始化UI组件
    initializeUI();
    
    // 设置信号与槽的连接
    setupConnections();
    
    // 初始化时从相机管理器获取当前设置并显示
    updateSettings();
}

/**
 * @brief CameraTriggerSettings析构函数
 */
CameraTriggerSettings::~CameraTriggerSettings()
{
    // 注意：m_cameraManager是外部传入的，不应该在这里删除
    // 只负责清理内部的UI资源
    delete ui;
}

/**
 * @brief 初始化UI组件
 * 
 * 设置触发沿下拉框的选项和触发通道SpinBox的范围
 */
void CameraTriggerSettings::initializeUI()
{
    // 初始化触发沿下拉框，添加上升沿和下降沿选项
    ui->triggerEdgeComboBox->addItem(tr("上升沿"), 0);  // 0表示上升沿
    ui->triggerEdgeComboBox->addItem(tr("下降沿"), 1);  // 1表示下降沿
    
    // 初始化触发通道SpinBox，设置有效范围
    ui->triggerChannelSpinBox->setMinimum(1);
    ui->triggerChannelSpinBox->setMaximum(2); // 根据实际支持的通道数调整
}

/**
 * @brief 设置信号与槽的连接
 * 
 * 连接UI组件的信号到对应的槽函数
 */
void CameraTriggerSettings::setupConnections()
{
    // 连接触发沿下拉框的索引变化信号
    connect(ui->triggerEdgeComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), 
            this, &CameraTriggerSettings::onTriggerEdgeChanged);
    
    // 连接触发通道SpinBox的值变化信号
    connect(ui->triggerChannelSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), 
            this, &CameraTriggerSettings::onTriggerChannelChanged);
    
    // 连接关闭按钮的点击信号
    connect(ui->closeButton, &QPushButton::clicked, this, &CameraTriggerSettings::onCloseButtonClicked);
    
    // 连接确定按钮的点击信号
    connect(ui->okButton, &QPushButton::clicked, this, &CameraTriggerSettings::onOkButtonClicked);
    
    // 连接取消按钮的点击信号
    connect(ui->cancelButton, &QPushButton::clicked, this, &CameraTriggerSettings::onCancelButtonClicked);
}

/**
 * @brief 更新界面显示的设置
 * 
 * 从相机管理器获取当前设备的触发参数，并更新UI组件
 */
void CameraTriggerSettings::updateSettings()
{
    // 检查必要条件：设备ID不能为空且相机管理器指针有效
    if (m_deviceId.isEmpty() || !m_pCameraDevcice) return;
    
    // 获取当前触发沿设置
    int triggerEdge = m_pCameraDevcice->getTriggerEdge();
    if (triggerEdge != -1) {  // 检查是否获取成功
        m_tempTriggerEdge = triggerEdge;  // 更新临时变量
        ui->triggerEdgeComboBox->setCurrentIndex(triggerEdge);
    }
    
    // 获取当前触发通道设置
    int triggerChannel = m_pCameraDevcice->getTriggerChannel();
    if (triggerChannel != -1) {  // 检查是否获取成功
        m_tempTriggerChannel = triggerChannel;  // 更新临时变量
        ui->triggerChannelSpinBox->setValue(triggerChannel);
    }
}

/**
 * @brief 触发沿改变时的处理函数
 * @param index 选择的触发沿索引
 */
void CameraTriggerSettings::onTriggerEdgeChanged(int index)
{
    // 只更新临时变量，不立即修改相机设置
    m_tempTriggerEdge = ui->triggerEdgeComboBox->itemData(index).toInt();
}

/**
 * @brief 触发通道改变时的处理函数
 * 
 * @param value 选择的触发通道值
 */
void CameraTriggerSettings::onTriggerChannelChanged(int value)
{
    // 只更新临时变量，不进行验证
    m_tempTriggerChannel = value;
}

/**
 * @brief 关闭按钮点击时的处理函数
 */
void CameraTriggerSettings::onCloseButtonClicked()
{
    // 关闭按钮相当于取消操作，不保存任何更改
    reject();
}

/**
 * @brief 确定按钮点击时的处理函数
 * 
 * 接受当前设置并关闭对话框
 */
void CameraTriggerSettings::onOkButtonClicked()
{
    // 检查必要条件
    if (m_deviceId.isEmpty() || !m_pCameraDevcice) {
        reject();
        return;
    }
    
    // 点击确认按钮时，验证触发通道值是否有效
    bool channelSuccess = m_pCameraDevcice->setTriggerChannel(m_tempTriggerChannel);
    
    if (!channelSuccess) {
        if(m_TempTriggerChannelStytle.isEmpty())
        {
            m_TempTriggerChannelStytle=ui->triggerChannelSpinBox->styleSheet();
        }
        ui->triggerChannelSpinBox->setStyleSheet("border: 1px solid red;");
        return;
    }
    // 确保边框恢复正常状态
    ui->triggerChannelSpinBox->setStyleSheet(m_TempTriggerChannelStytle);
    // 触发通道设置成功后，再设置触发沿
    bool edgeSuccess = m_pCameraDevcice->setTriggerEdge( m_tempTriggerEdge);
    if (!edgeSuccess) {
        if(m_TempTriggerEdgeStytle.isEmpty())
        {
            m_TempTriggerEdgeStytle=ui->triggerEdgeComboBox->styleSheet();
        }
        ui->triggerEdgeComboBox->setStyleSheet("border: 1px solid red;");
        return;  // 不关闭对话框，让用户修正输入
    }
    ui->triggerEdgeComboBox->setStyleSheet(m_TempTriggerEdgeStytle);
    // 触发通道设置成功，接受对话框
    accept();
}

/**
 * @brief 取消按钮点击时的处理函数
 * 
 * 取消所有更改并关闭对话框
 */
void CameraTriggerSettings::onCancelButtonClicked()
{
    // 取消设置，不应用任何更改，直接关闭对话框
    reject();
}

/**
 * @brief 鼠标按下事件处理函数
 * 
 * 处理窗口拖拽功能的开始
 * 
 * @param event 鼠标事件对象
 */
void CameraTriggerSettings::mousePressEvent(QMouseEvent *event)
{
    // 只有在标题栏区域按下鼠标左键才启动拖拽
    if (event->button() == Qt::LeftButton) {
        // 检查鼠标是否在标题栏区域内
        if (event->pos().y() <= ui->titleWidget->height()) {
            m_isDragging = true;
            // 计算拖拽的起始位置
            m_dragStartPosition = event->globalPos() - frameGeometry().topLeft();
            event->accept();
        }
    }
    // 调用父类的事件处理函数
    QDialog::mousePressEvent(event);
}

/**
 * @brief 鼠标移动事件处理函数
 * 
 * 处理窗口拖拽功能的移动
 * 
 * @param event 鼠标事件对象
 */
void CameraTriggerSettings::mouseMoveEvent(QMouseEvent *event)
{
    // 只有在拖拽状态下且左键按下时才移动窗口
    if (m_isDragging && (event->buttons() & Qt::LeftButton)) {
        // 计算新位置并移动窗口
        move(event->globalPos() - m_dragStartPosition);
        event->accept();
    }
    // 调用父类的事件处理函数
    QDialog::mouseMoveEvent(event);
}

/**
 * @brief 鼠标释放事件处理函数
 * 
 * 结束窗口拖拽功能
 * 
 * @param event 鼠标事件对象
 */
void CameraTriggerSettings::mouseReleaseEvent(QMouseEvent *event)
{
    // 结束拖拽状态
    m_isDragging = false;
    // 调用父类的事件处理函数
    QDialog::mouseReleaseEvent(event);
}
